// Clase que define a las posibles soluciones al problema dentro del algoritmo genetico.
package mx.unam.ia.algoritmos;

import mx.unam.ia.estructuras.ArbolExpresionBinario;

/**
 *
 * @author Juan Fco. Navarrete
 */

// Se define la expresión y la representación en árbol binario, además de la evaluación.
public class Cromosoma implements Comparable<Cromosoma>
{
    private String expresion;
    private double evaluacion;
    private ArbolExpresionBinario arbol;

    public Cromosoma(String expresion)
    {
        this.expresion = expresion;
        this.arbol = ArbolExpresionBinario.generar(expresion.toString());
        this.evaluacion = Long.MAX_VALUE;
    }

    public ArbolExpresionBinario getArbol() //Función que obtiene la expresion del arbol binario
    {
        return arbol;
    }

    public void setArbol(ArbolExpresionBinario arbol) //Funciones que establece el arbol binario
    {
        this.arbol = arbol;
    }

    public String getExpresion() //Funcion que obtiene la expresion
    {
        return expresion;
    }

    public void setExpresion(String expresion) //La expresión obtenida se evalua dentro del árbol binario.
    {
        this.expresion = expresion;
        this.arbol = ArbolExpresionBinario.generar(expresion);
    }

    public double getEvaluacion() //Funcion que obtiene la evaluacion
    {
        return evaluacion;
    }

    public void setEvaluacion(double evaluacion) //Funcion que define la evaluacion
    {
        this.evaluacion = evaluacion;
    }

    @Override
    public String toString()  //Se obtiene la cadena de la evaluacion con la de la expresion
    {
        return "Evaluacion: " + evaluacion + "\tExpresion: " + expresion;
    }

    public int compareTo(Cromosoma cromosoma) //Funcion que compara la evaluacion actual con la del cromosoma.
    {
        return Double.compare(this.evaluacion,cromosoma.getEvaluacion());        
    }
}
